/*
 * @Description:Server
 * 
 * @Author: rendc
 * 
 * @Date: 2025-03-19 10:26:42
 * 
 * @LastEditors: rendc
 * 
 * @LastEditTime: 2025-03-19 14:49:15
 */

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
  // 搭建一个多线程服务器，端口为8989，要求如下
  // 1.接收客户端发送的聊天信息并显示
  // 如果收到的是quit，则结束读取，关闭服务器
  // 2.服务器将收取的字符串进行反转，再返回给客户端
  public static void main(String[] args) throws Exception {
    // 1. 搭建Tcp服务器
    int port = 8989; // 指定服务器启动的端口
    ServerSocket server = new ServerSocket(port); // 创建服务器对象
    System.out.println("服务器：已启动，端口" + port);
    while (true) {
      // 2. 接收客户端的连接
      Socket client = server.accept();
      System.out.println("服务器：客户端连接成功");
      // 分离子线程
      Thread thread = new Thread() {
        @Override
        public void run() {
          // 获取IO流
          BufferedReader br = null;
          PrintStream ps = null;
          try {
            br = new BufferedReader(new InputStreamReader(client.getInputStream()));
            ps = new PrintStream(client.getOutputStream());
            String line;
            StringBuffer sbBuffer = new StringBuffer();
            while ((line = br.readLine()) != null) {
              System.out.println("服务器：line" + line);
              // 如果是quit 跳出循环
              if ("quit".equals(line)) {
                break;
              }
              // 反转字符串
              sbBuffer.delete(0, sbBuffer.length());
              sbBuffer.append(line);
              sbBuffer.reverse();
              String msg = sbBuffer.toString();
              ps.println(msg);
              System.out.println("服务器：已经推送信息到客户端" + msg);
            }
          } catch (Exception e) {
            e.printStackTrace();
          } finally {
            try {
              // 关闭资源
              if (ps != null) {
                ps.close();
              }
              if (ps != null) {
                br.close();
              }
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        };
      };
      thread.start();
    }
  }
}
